package com.yutian.commandapp;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 精确计算
 *
 * @author zhoulei7
 * @create 2020-10-15
 **/
public class BigDecimalOper {

    private BigDecimal i1;

    private BigDecimal i2;

    public BigDecimalOper(int i1, int i2) {
        this.i1 = BigDecimal.valueOf(i1);
        this.i2 = new BigDecimal(i2);
    }

    /**
     * new BigDecimal参数类型为double的构造方法的结果有一定的不可预知性。因为计算机无法准确的表示浮点数，反之亦然，我们的double型0.1对于计算机来说并不是，对于计算机来说它认为的0.1其实是0.1000000000000000055511151231257827021181583404541015625。
     * 1.1 + 1.3
     * @param i1
     * @param i2
     */
    public BigDecimalOper(double i1, double i2) {
        this.i1 = new BigDecimal(i1 + "");
        this.i2 = new BigDecimal(i2 + "");
    }

    public BigDecimal add(){
        return i1.add(i2);
    }

    public BigDecimal subtract(){
        return i1.subtract(i2);
    }

    public BigDecimal multiply(){
        return i1.multiply(i2);
    }

    /**
     * 某些场景下对于如1/3会得到一个无穷小数，这个时候需要定义计算结果要保留到小数点后几位，否则就会抛出异常:
     * Non-terminating decimal expansion; no exact representable decimal result.
     * @return
     */
    @Deprecated
    public BigDecimal divide(){
        return i1.divide(i2);
    }

    /**
     * 扩展
     * @param scale
     * @return
     */
    public BigDecimal dividePrecise(int scale){
        return i1.divide(i2, scale, RoundingMode.HALF_UP);
    }
}
